
var MatcherTest = new YAHOO.tool.TestCase({

    name: "MatcherTest",

    setUp: function () {},
    tearDown: function () {},

    /**
     * 正規表現で指定した場合のテスト
     */
    testRegExp: function () {
        var assert = YAHOO.util.Assert;

        var m = new container.Matcher( /.*a$/, /.*aa$/ );
        assert.isTrue( m.match( "xxa" ) );
        assert.isFalse( m.match( "xaa" ) );
        assert.isFalse( m.match( "xxb" ) );

        m = new container.Matcher( /.*a$/ );
        assert.isTrue( m.match( "xxa" ) );
        assert.isTrue( m.match( "xaa" ) );
        assert.isFalse( m.match( "xxb" ) );

        m = new container.Matcher( null, /.*aa$/ );
        assert.isFalse( m.match( "xxa" ) );
        assert.isFalse( m.match( "xaa" ) );
        assert.isFalse( m.match( "xxb" ) );

        m = new container.Matcher( );
        assert.isFalse( m.match( "xxa" ) );
        assert.isFalse( m.match( "xaa" ) );
        assert.isFalse( m.match( "xxb" ) );
    },

    /**
     * 正規表現の配列で指定した場合のテスト
     */
    testRegExpArray: function () {
        var assert = YAHOO.util.Assert;

        var m = new container.Matcher( [/.*a$/, /.*b$/, /.*c$/], [/.*aa$/, /.*bb$/, /.*cc$/] );
        assert.isTrue( m.match( "xxa" ) );
        assert.isFalse( m.match( "xaa" ) );
        assert.isTrue( m.match( "xxb" ) );
        assert.isFalse( m.match( "xbb" ) );
        assert.isTrue( m.match( "xxc" ) );
        assert.isFalse( m.match( "xcc" ) );

        assert.isFalse( m.match( "xxx" ) );

        m = new container.Matcher( [/.*a$/, /.*b$/, /.*c$/] );
        assert.isTrue( m.match( "xxa" ) );
        assert.isTrue( m.match( "xaa" ) );
        assert.isTrue( m.match( "xxb" ) );
        assert.isTrue( m.match( "xbb" ) );
        assert.isTrue( m.match( "xxc" ) );
        assert.isTrue( m.match( "xcc" ) );

        assert.isFalse( m.match( "xxx" ) );

        m = new container.Matcher( null, [/.*aa$/, /.*bb$/, /.*cc$/] );
        assert.isFalse( m.match( "xxa" ) );
        assert.isFalse( m.match( "xaa" ) );
        assert.isFalse( m.match( "xxb" ) );
        assert.isFalse( m.match( "xbb" ) );
        assert.isFalse( m.match( "xxc" ) );
        assert.isFalse( m.match( "xcc" ) );

        assert.isFalse( m.match( "xxx" ) );
    },

    /**
     * 関数で指定した場合のテスト
     */
    testFunction: function () {
        var assert = YAHOO.util.Assert;

        var m = new container.Matcher( function( value ) {
            return value == "hoge";
        },
        function( value ) {
            return value == "foo";
        } );
        assert.isTrue( m.match( "hoge" ) );
        assert.isFalse( m.match( "foo" ) );
        assert.isFalse( m.match( "xxb" ) );

        m = new container.Matcher( function( value ) {
            return value == "hoge";
        } );
        assert.isTrue( m.match( "hoge" ) );
        assert.isFalse( m.match( "foo" ) );
        assert.isFalse( m.match( "xxb" ) );

        m = new container.Matcher( null, function( value ) {
            return value == "hoge";
        } );
        assert.isFalse( m.match( "hoge" ) );
        assert.isFalse( m.match( "foo" ) );
        assert.isFalse( m.match( "xxb" ) );
    },

    /**
     * 関数で指定した場合のテスト
     */
    testIllegalArgument: function () {
        var assert = YAHOO.util.Assert;
        try {
            new container.Matcher( "a" );
            fail();
        } catch ( error ) {
            assert.areEqual( error.errorCode, container.ErrorCode.IllegalArgument );
        }
        try {
            new container.Matcher( /.*/, "a" );
            fail();
        } catch ( error ) {
            assert.areEqual( error.errorCode, container.ErrorCode.IllegalArgument );
        }
    }
});
